package com.eudon.design_pattern.behavioral.interpreter;

/**
 * @author eudon
 * @description 解释器模式使用示例 - 告警规则解析器
 * @date 2025/9/3
 * @email syd19970616@gmail.com
 * @address <a href="https://gitee.com/eudon">Gitee</a>
 */
public class Use {
    public static void main(String[] args) {
        System.out.println("=== 解释器模式 - 告警规则解析器示例 ===");
        
        // 创建告警系统
        AlertSystem alertSystem = new AlertSystem();
        
        // 创建上下文，模拟接口调用数据
        Context context = new Context();
        
        // 设置接口A的数据
        context.setCallCount("A", 150);    // 调用次数150
        context.setFailCount("A", 15);     // 失败次数15
        context.setFailRate("A", 0.1);     // 失败率10%
        
        // 设置接口B的数据
        context.setCallCount("B", 80);     // 调用次数80
        context.setFailCount("B", 5);      // 失败次数5
        context.setFailRate("B", 0.06);    // 失败率6%
        
        // 设置接口C的数据
        context.setCallCount("C", 600);    // 调用次数600
        context.setFailCount("C", 8);      // 失败次数8
        context.setFailRate("C", 0.15);    // 失败率15%
        
        System.out.println("\n当前接口数据:");
        System.out.println("接口A: 调用次数=150, 失败次数=15, 失败率=10%");
        System.out.println("接口B: 调用次数=80, 失败次数=5, 失败率=6%");
        System.out.println("接口C: 调用次数=600, 失败次数=8, 失败率=15%");
        
        System.out.println("\n=== 开始检查告警规则 ===");
        
        // 测试规则1：AND逻辑 - 应该触发告警
        System.out.println("\n1. 测试AND逻辑规则:");
        alertSystem.checkAlert("接口A调用次数 > 100 并且 接口A失败次数 > 10", context);
        
        // 测试规则2：OR逻辑 - 应该触发告警
        System.out.println("\n2. 测试OR逻辑规则:");
        alertSystem.checkAlert("接口B调用次数 > 500 或者 接口B失败率 > 0.05", context);
        
        // 测试规则3：单个条件 - 应该触发告警
        System.out.println("\n3. 测试单个条件规则:");
        alertSystem.checkAlert("接口C失败率 > 0.1", context);
        
        // 测试规则4：不满足条件 - 不应该触发告警
        System.out.println("\n4. 测试不满足条件的规则:");
        alertSystem.checkAlert("接口B调用次数 > 200 并且 接口B失败次数 > 20", context);
        
        // 测试规则5：复杂的OR逻辑 - 应该触发告警
        System.out.println("\n5. 测试复杂OR逻辑规则:");
        alertSystem.checkAlert("接口A失败次数 > 20 或者 接口C调用次数 > 500", context);
        
        System.out.println("\n=== 解释器模式演示完成 ===");
        System.out.println("\n解释器模式核心思想:");
        System.out.println("1. 将复杂的规则字符串解析成表达式树");
        System.out.println("2. 通过递归调用interpret方法执行规则判断");
        System.out.println("3. 支持组合表达式(AND/OR)和基本比较表达式");
        System.out.println("4. 易于扩展新的操作符和表达式类型");
    }
}